Traté de ejecutar FastAPI usando el servidor web uvicorn pero arroja un error.
Ejecuto este comando,
uvicorn api:app --reload --host 0.0.0.0
pero hay un error en la terminal.
Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) Started reloader process [23445] Error loading ASGI app. Could not import module "api". Stopping reloader process [23445]Agradezco mucho cualquier recomendación o sugerencia
su error tipográfico en "api" verifique su nombre de archivo.
Agregue el nombre del directorio delante de su nombre de archivo
uvicorn src.main:app o cd en ese directorio
cd src uvicorn main:appOcurre porque no está en la misma carpeta con su instancia de la aplicación FastAPI más específicamente:
Digamos que tengo un árbol de aplicaciones como este;
my_fastapi_app/ ├── app.yaml ├── docker-compose.yml ├── src │ └── main.py └── tests ├── test_xx.py └── test_yy.py $ pwd # Present Working Directory /home/yagiz/Desktop/my_fastapi_appNo estoy dentro de la misma carpeta con la instancia de mi aplicación, por lo que si intento ejecutar mi aplicación con uvicorn, obtendré un error como el tuyo.
$ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [40645] using statreload ERROR: Error loading ASGI app. Could not import module "main".La respuesta es muy simple, agregue el nombre de la carpeta delante de su nombre de archivo
uvicorn src.main:app --reloado puede cambiar su directorio de trabajo
cd srcAhora estoy dentro de la carpeta con la instancia de mi aplicación.
src └── main.pyEjecuta tu uvicornio de nuevo
$ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [40726] using statreload INFO: Started server process [40728] INFO: Waiting for application startup. INFO: Application startup complete.Tuve el mismo problema y lo resolví agregando el nombre del paquete antes de main, en tu caso probando:
uvicorn src.main:app --reloadpuede resolver el problema
Esto funcionó para mí, mire los documentos para fastAPI. Estoy muy agradecido de haberlo encontrado, ya que el script de Python debe llamarse main.py no app.py
El comando uvicorn main:app se refiere a:
main : el archivo main.py (el "módulo" de Python).app : el objeto creado dentro de main.py con la línea app = FastAPI()--reload : hace que el servidor se reinicie después de cambios en el código. Uso exclusivo para desarrollo.Una razón por la que esto podría estar sucediendo es que está utilizando:
uvicorn src/main:app --reloaden lugar de la sintaxis correcta :
uvicorn src.main:app --reloadNote el . en lugar de la /
Eso suponiendo que (1) su estructura sea algo como esto:
project_folder/ ├── some_folder ├── src │ └── main.py └── tests ├── test_xx.py └── test_yy.py (2) que su objeto FastAPI() está efectivamente asignado a un objeto llamado app en main.py :
app = FastAPI() (3) está ejecutando el comando uvicorn desde project_folder , por ejemplo:
(venv) <username>@<pcname>:~/PycharmProjects/project_folder$ uvicorn src.main:app --reloadParece que es importante que nombre su archivo main.py, de lo contrario no funcionará.
Editar: en realidad, estaba ejecutando Jupyter Notebook en el puerto 8888, por lo que ese puerto ya estaba ocupado. Si tiene que ejecutar el cuaderno Jupyter, ejecútelo después de ejecutar el servidor API, el cuaderno se ejecutará automáticamente en 8889. Alternativamente, puede ejecutar el servidor API en un puerto diferente.
Presione el botón Guardar en VS Code, etc. porque a veces arrojará este error si no ha guardado el archivo. Me sucedió.
mover la declaración de importación para FastAPI a la parte superior de las declaraciones de importación corrige el error.
from fastapi import FastAPI "luego cualquier otra declaración de importación"
Use esta estructura de carpetas y configuración donde main está en el directorio principal 
lanzamiento.json
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Python: FastAPI", "type": "python", "request": "launch", "module": "uvicorn", "args": [ "main:app" ], "jinja": true } ] }principal.py
from fastapi import FastAPI app = FastAPI( title="test", description="test", version="0.0.1", ) if __name__ == "__main__": import uvicorn uvicorn.run( "main:app", host="0.0.0.0", reload=True, port=3001, )